﻿/*830. 单调栈

给定一个长度为 N的整数数列，输出每个数左边第一个比它小的数，如果不存在则输出 −1

输入格式
第一行包含整数 N，表示数列长度。
第二行包含 N 个整数，表示整数数列。

输出格式
共一行，包含 N个整数，其中第 i个数表示第 i 个数的左边第一个比它小的数，如果不存在则输出 −1

数据范围
1≤N≤105，1≤数列中元素≤109

输入样例：
5
3 4 2 7 5
输出样例：
-1 3 -1 2 2*/
//单调栈
#include<iostream>

using namespace std;
const int N = 100010;

int n;
int stk[N], tt;//全局变量 默认值为0 

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        int x;
        cin >> x;//if(tt&& stk[tt]>=x) tt--;
        while (tt && stk[tt] >= x) tt--;//出栈
        if (tt) cout << stk[tt] << ' ';
        else cout << -1 << ' ';
        stk[++tt] = x;//++tt,stk[tt] 从1开始，tt指向栈顶元素
    }
    return 0;
}
/*总结：
看了几遍视频，有点点难理解，不过不要畏难
核心思想就是：栈顶元素和x比较，站内大就出栈，栈为空说明栈内元素都大输出-1，否则输出栈顶元素，然后把当前元素入栈
注意入栈的顺序在后面，先把栈顶元素输出之后再入栈
 while (tt && stk[tt] >= x) tt--;不是if(..)
*/